package com.michale.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.michale.common.domain.model.TreeSelect;
import com.michale.common.domain.permissions.MenuEntity;
import com.michale.system.vo.login.RouterVo;
import io.swagger.annotations.Api;

import java.util.List;
import java.util.Set;

/**
 * @author Michale
 * @apiNote  菜单权限表 服务层
 */
@Api(value = "菜单权限表-服务类")
public interface MenuService extends IService<MenuEntity> {

    /**
     * 根据用户查询系统菜单列表
     *
     * @param menuEntity 菜单信息
     * @return 菜单列表
     */
    List<MenuEntity> selectMenuList(MenuEntity menuEntity);

    /**
     * 根据菜单ID查询信息
     *
     * @param menuId 菜单ID
     * @return 菜单信息
     */
    MenuEntity selectMenuById(Long menuId);

    /**
     * 新增菜单信息
     *
     * @param menuEntity 菜单信息
     * @return 结果
     */
    int insertMenu(MenuEntity menuEntity);

    /**
     * 修改菜单信息
     *
     * @param menuEntity 菜单信息
     * @return 结果
     */
    int updateMenu(MenuEntity menuEntity);

    /**
     * 删除菜单
     *
     * @param menuId 菜单ID
     * @return 结果
     */
    int deleteMenuById(Long menuId);

    /**
     * 根据角色ID-查询权限
     *
     * @param roleId 角色Id
     * @return 菜单权限
     */
    Set<String> selectMenuPermsByRoleId(Long roleId);

    /**
     * 根据用户ID-查询权限
     *
     * @param userId 用户Id
     * @return 菜单权限
     */
    Set<String> selectMenuPermsByUserId(Long userId);

    /**
     * 通过用户ID获取菜单路由信息
     *
     * @param userId 用户ID
     * @return 菜单路由信息
     */
    List<MenuEntity> selectMenuTreeByUserId(Long userId);

    /**
     * 构建前端路由所需要的菜单
     *
     * @param menus 菜单列表
     * @return 路由列表
     */
    List<RouterVo> buildMenus(List<MenuEntity> menus);

    /**
     * 是否存在菜单子节点
     *
     * @param menuId 菜单ID
     * @return 结果 true 存在 false 不存在
     */
    boolean hasChildByMenuId(Long menuId);

    /**
     * 查询菜单是否存在角色
     *
     * @param menuId 菜单ID
     * @return 结果 true 存在 false 不存在
     */
    boolean checkMenuExistRole(Long menuId);

    /**
     * 校验菜单名称是否唯一
     *
     * @param menuEntity 菜单信息
     * @return 结果
     */
    String checkMenuNameUnique(MenuEntity menuEntity);

    /**
     * 根据角色ID-查询选中的菜单ID
     *
     * @param roleId 角色ID
     * @return 选中菜单列表
     */
    List<Long> selectMenuListByRoleId(Long roleId);

    /**
     * 构建-前端添加角色添加菜单所需要树结构-3
     *
     * @param menuEntity 登录者ID
     * @return 菜单列表
     */
    List<TreeSelect> selectMenuTreeList(MenuEntity menuEntity);

    /**
     * 构建-前端添加角色添加菜单所需要树结构-2
     *
     * @param menus 菜单列表
     * @return 下拉树结构列表
     */
    List<TreeSelect> buildMenuTreeSelect(List<MenuEntity> menus);

    /**
     * 构建-菜单所需要树结构-1
     *
     * @param menus 菜单列表
     * @return 树结构列表
     */
    List<MenuEntity> buildMenuTree(List<MenuEntity> menus);
}
